#ifndef _CAMERA_NODE_HPP_
#define _CAMERA_NODE_HPP_

// 基础依赖头文件
#include <atomic>
#include <memory>
#include <thread>
#include <vector>
#include <chrono>
using namespace std::chrono_literals;


// 相机封装头文件
#include "camera.hpp"
#include "mindvision.hpp"

// ROS2 核心依赖
#include "rclcpp/rclcpp.hpp"
#include "rcl_interfaces/msg/set_parameters_result.hpp"

// image_transport 组件化
#include <image_transport/image_transport.hpp>
#include <image_transport/camera_publisher.hpp>

// ROS2 图像与相机信息依赖
#include "sensor_msgs/msg/image.hpp"
#include "sensor_msgs/msg/camera_info.hpp"
#include "camera_info_manager/camera_info_manager.hpp"

namespace camera_driver
{
    class CameraNode : public rclcpp::Node
    {
    public:
        CameraNode(const rclcpp::NodeOptions &options = rclcpp::NodeOptions());
        ~CameraNode() override;

    private:
        // -------------------------- 核心成员变量声明 --------------------------
        // 相机封装实例
        std::unique_ptr<io::Camera> camera_;
        // image_transport 相机发布器
        image_transport::CameraPublisher camera_pub_;
        // 相机内参消息
        sensor_msgs::msg::CameraInfo camera_info_msg_;
        // 相机信息管理器（用于加载 yaml 标定文件）
        std::unique_ptr<camera_info_manager::CameraInfoManager> camera_info_manager_;

        // 相机参数结构体（存储从 ROS 参数服务器读取的配置）
        io::CameraParams camera_params_;
        // 图像发布线程与运行标志（原子变量确保线程安全）
        std::thread publish_thread_;
        std::atomic<bool> publish_thread_running_;

        // 动态参数回调句柄（用于注册和管理参数修改回调）
        rclcpp::node_interfaces::OnSetParametersCallbackHandle::SharedPtr params_callback_handle_;

        // -------------------------- 私有成员函数声明 --------------------------
        /**
         * @brief 声明并读取 ROS 参数服务器中的相机配置，填充到 camera_params_
         */
        void declareCameraParams();

        /**
         * @brief 初始化 ROS 图像发布器（配置 QoS 策略）
         */
        void initImagePublisher();

        /**
         * @brief 初始化相机内参信息（用 yaml 文件）
         */
        void initCameraInfo();

        /**
         * @brief 注册动态参数回调（支持实时修改曝光、伽马）
         */
        void registerDynamicParamsCallback();

        /**
         * @brief 启动图像发布线程（ThreadSafeQueue 数据）
         */
        void startPublishThread();

        /**
         * @brief 停止图像发布线程
         */
        void stopPublishThread();

        /**
         * @brief 图像发布循环（线程函数，持续读取相机数据并发布）
         */
        void publishImageLoop();

        /**
         * @brief 动态参数修改回调函数（处理曝光、伽马等参数的实时更新）
         * @param parameters 待修改的参数列表
         * @return 修改结果（成功/失败 + 失败原因）
         */
        rcl_interfaces::msg::SetParametersResult onDynamicParamsChanged(
            const std::vector<rclcpp::Parameter> &parameters);
    };
}
#endif